﻿using System;
using System.Data.Objects;
using System.Collections;
using System.Data;
using UtfprLibrary.ComponentModel;
using UtfprLibrary.EntityFramework.ComponentModel;

namespace UtfprLibrary.EntityFramework.ComponentModel {
    public interface IEntityDataSource : IUtfprDesignTimeService {
        /// <summary>
        /// TODO
        /// </summary>
        EntitySetCollection EntitySets { get; }

        /// <summary>
        /// TODO
        /// </summary>
        Type ObjectContextType { get; set; }

        /// <summary>
        /// TODO
        /// </summary>
        ObjectContext ObjectContext { get; set; }

        /// <summary>
        /// TODO
        /// </summary>
        ListDictionary GetLookupDictionary(Type elementType);

        /// <summary>
        /// TODO
        /// </summary>
        void CancelChanges();

        /// <summary>
        /// TODO
        /// </summary>
        void Refresh();

        /// <summary>
        /// Persiste todas as alterações feitas no contexto.
        /// </summary>
        int SaveChanges();

        /// <summary>
        /// Adiciona uma nova entidade no contexto.
        /// </summary>
        /// <param name="newObject">Uma nova entidade.</param>
        void Add(object entity);

        /// <summary>
        /// Adiciona uma coleção de entidades no contexto.
        /// </summary>
        /// <param name="entities">Uma coleção de entidades.</param>
        /// <param name="entityState">Uma restrição de estado para a entidade a ser adicionada.</param>
        void Add(IList entities, EntityState entityState);

        /// <summary>
        /// Remove uma entidade do contexto.
        /// </summary>
        /// <param name="obsoleteObject">Uma entidade obsoleta.</param>
        void Delete(object entity);

        /// <summary>
        /// Busca uma entidade pela chave.
        /// </summary>
        /// <param name="entityType">O tipo de entidade.</param>
        /// <param name="id">A chave da entidade.</param>
        /// <param name="fetchMode">O modo de busca.</param>
        /// <returns></returns>
        object FindById(Type entityType, object id, FetchModeEnum fetchMode, IUtfprRelatedEndDescription[] relatedEndDescriptions);

        /// <summary>
        /// TODO
        /// </summary>
        object FindById(Type entityType, object id, bool isString, bool isCaseInsensitive, FetchModeEnum fetchMode, IUtfprRelatedEndDescription[] relatedEndDescriptions);

        void LoadRelatedEnds(object entity, IUtfprRelatedEndDescription[] relatedEndDescriptions);
    }
}
